#include <iostream>
#include <future>
#include <thread>
/*
    promise：类模板，用于线程间通信和异步操作中获取操作结果的一种机制
        它允许在一个线程中设置某个值，而在另一个线程中通过获取它关联的future对象来获取设置的结果

    future和promise之间的区别：
        future用来获取异步结果，而promise内部包含了future，用来设置异步结果，然后通过关联的future来获取

    既然有了async来异步执行任务，packaged_task来把任务打包成一个可调用对象，必要的时候调用，这两中机制都可以返回关联的futured对象，来获取异步执行结果
    那为什么还需要promise呢？
    因为promise更加的灵活，我们可以通过promise在异步任务中任何一个阶段获取想要的结果
*/
int add(int a, int b)
{
    std::cout << "add\n";
    return a + b;
}

int main()
{
    // 1、创建promises对象
    std::promise<int> pro;
    
    // 2、获取关联的future对象
    std::future<int> res = pro.get_future();

    // 3、异步执行任务
    std::thread td([&pro](){
        int sum = add(1, 2);
        pro.set_value(sum);
        std::this_thread::sleep_for(std::chrono::seconds(3)); // 异步执行到这里，主线程通过get已经获取到了结果，就继续往下执行
    });

    // 4、获取结果
    std::cout << res.get() << std::endl; // 内部阻塞主线程，直到获取到结果
    td.join();
    return 0;
}